package cn.dduan.fool.design.pattern.great.factory;

/**
 * 工厂方法模式
 * <p>
 * 优点：
 * 1、工厂方法模式将工厂抽象化，并定义一个创建对象的接口
 * 2、每增加新产品，只需增加该产品以及对应的具体实现工厂类，由具体工厂类决定要实例化的产品是哪个，将对象的创建与实例化延迟到子类
 * 3、符合【开闭原则】，扩展时不必去修改原来的代码
 * <p>
 * 缺点：
 * 1、每增加一个产品都需要增加一个具体产品类和实现工厂类，使得系统中类的个数成倍增加
 * 2、在一定程度上增加了系统的复杂度，同时也增加了系统具体类的依赖
 *
 * @author dduan
 * @version 1.0
 * @date 2023/4/7
 */
public class FactoryMethod {
    public static void main(String[] args) {
        System.out.println("工厂方法模式");
        FactoryBMW320 factoryBMW320 = new FactoryBMW320();
        BMW320 bmw320 = factoryBMW320.create();
        FactoryBMW523 factoryBMW523 = new FactoryBMW523();
        BMW320 bmw523 = factoryBMW320.create();
    }
}

/**
 * 创建工厂接口
 *
 * @author dduan
 * @version 1.0
 * @date 2023/4/7
 */
interface Factory {
    BMW create();
}

/**
 * 工厂接口实现
 *
 * @author dduan
 * @version 1.0
 * @date 2023/4/7
 */
class FactoryBMW320 implements Factory {
    @Override
    public BMW320 create() {
        return new BMW320();
    }
}

/**
 * 工厂接口实现
 *
 * @author dduan
 * @version 1.0
 * @date 2023/4/7
 */
class FactoryBMW523 implements Factory {
    @Override
    public BMW523 create() {
        return new BMW523();
    }
}
